#include <bits/stdc++.h>

using namespace std;

class Solution
{
public:
    // static bool cmp(const pair<int, int> &v1, const pair<int, int> &v2)
    // {
    //     return v1.second > v2.second;
    // }

    // vector<int> topKFrequent(vector<int> &nums, int k)
    // {
    //     unordered_map<int, int> map;
    //     for (auto num : nums)
    //     {
    //         map[num]++;
    //     }
    //     vector<pair<int, int>> vec(map.begin(), map.end());
    //     sort(vec.begin(), vec.end(), cmp);
    //     vector<int> res;
    //     for (int i = 0; i < k; i++)
    //     {
    //         res.push_back(vec[i].first);
    //     }
    //     return res;
    // }
    struct cmp
    {
        bool operator()(const pair<int, int> &v1, const pair<int, int> &v2)
        {
            return v1.second > v2.second;
        }
    };

    vector<int> topKFrequent(vector<int> &nums, int k)
    {
        unordered_map<int, int> map;
        for (auto num : nums)
        {
            map[num]++;
        }
        priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> que;
        for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++)
        {
            que.push(*it);
            if (que.size() > (size_t)k)
            {
                que.pop();
            }
        }
        vector<int> res(k);
        for (int i = k - 1; i >= 0; i--)
        {
            res[i] = que.top().first;
            que.pop();
        }
        return res;
    }
};

int main()
{
    vector<int> vec{1, 1, 1, 2, 2, 3};
    // vector<int> vec{1};
    Solution sol;
    vector<int> res = sol.topKFrequent(vec, 2);
    for (auto num : res)
    {
        cout << num << " ";
    }
    cout << endl;
    return 0;
}